上一篇文章講完 K8s 的觀念後相信大家都稍微了解 K8s 在做什麼事情了吧XD
今天這篇文章要趁勝追擊開始正式進入 K8s 的內容介紹了,首先要來介紹的是 Pod。
Pod 其實是 K8s 中可以運行的最小單位,單位只是個名稱,重點是這個單位是用來做什麼事情,舉例來說:公分,公分是一個單位而他是長度單位,重點在長度這兩個字所以我們才知道公分是用來表示長度的,Pod 也是一樣的道理,今天我們在 Pod 裡面運行一個前端的內容,那我們就知道這個 Pod 是用來代表前端的。
這時候可能會有一個疑惑要如何在 Pod 裡面運行應用程式的相關內容呢?這時候就要依賴 Docker 了,所以我說 K8s 是加強版的 Docker Swarm 完全無誤?
我們都知道 Docker 是依照使用者寫好的 Dockerfile 建構出一個 Docker image 出來,並藉由這個 image 跑出 container,所以真正運行的是 container,接下來就讓我們把這個觀念帶進去 K8s 裡面吧!
前面提到 Pod 是 K8s 可以運行的最小單位,所以我們今天想讓一個 container 能在 K8s 裡面跑起來勢必就需要一個 Pod ,當然我前面提到 Pod 只是一個運行單位而已,今天想在裡面運行什麼完全是使用者自行定義,所以我也可以在 Pod 裡面運行超多個 container 都沒有問題,但這樣就會有一個問題很難控管裡面的內容,一樣舉個例子:今天講了公分,結果這個公分既是長度單位也是重量單位,假如我今天說 10 公分就很難知道到底指的是長度還是重量對吧!
官方文件有講到這句話: Pods that run multiple containers that need to work together. 一般來說應該很少會寫出具有依賴性的專案才對,所以筆者還是建議一個 Pod 裡面一個 container 就好嘍!
講完了基礎觀念後接下來講一些重點觀念吧!
前面提到 Pod 其實也是基於 Docker image 而跑出可運行的 container ,那這個 image 哪來呢?其實 K8s 預設會從 DockerHub 上抓下來,當然比較暴力的作法就是自己在 DockerHub 上面創一個帳號把寫好的 Dockerfile 都丟上去,但這樣真的太搞剛所以可以加上 imagePullPolicy: ifNotPresent
的方式,這樣就會先從本地端抓取 image 了,至於完整寫法的部分等等會提到。
通常我們在運行 container 的時候一定會開啟 port 好讓外部可以順利連進去,在 K8s 也是一樣的道理,所以我們在撰寫 Pod 的描述檔的時候一定要記得開放 port 讓外部可以連進去喔!
每個 Pod 在被建立的時候都會有一組自己的 ClusterIP ,這組 ClusterIP 只有在該 Cluster 內才能被存取的,外部是無法存取的,假如要存取該 Pod 的內容就必須要依靠一些手段,這些手段待後續的文章會有詳細的介紹,這裡讀者稍微有個印象就好。
首先 K8s 就像 Docker Compose 一樣,必須要用 YAML
的格式進行撰寫,在開始介紹各個屬性之前我們來看個簡單的範例吧!
apiVersion: v1
kind: Pod
metadata:
name: helloworld
spec:
containers:
- name: helloworld
image: w5151381guy/helloworld
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
目前 K8s 中該元件的版本號,必須要依照 server 上 K8s 的版本來進行設定,由於現在 K8s 基本上都是安裝 1.9 以上,所以 apiVersion
就直接寫上 v1
就好。
用來決定此設定檔的類型,假如今天要創立一個 Pod ,我們寫法就會是 kind: Pod
。
用來擺放描述性資料的地方,像是 Pod 名稱等等都會擺在這。
用來描述物件被生成的細節,像 Pod 內其實是跑 Docker container ,所以在 Pod 的 spec 內就會描述 container 的細節。
了解完 Pod 的相關設定後接下來就試著建立剛剛寫好的 Pod 描述檔吧~
這邊就需要利用上一篇文章提到的 kubectl
了,在終端機下 kubectl apply -f fileName.yaml
即可建立 fileName.yaml
內描述的資訊,這邊有一個 -f
的參數,其實 -f
代表的就是 file 的意思,所以我們在建立所有的 K8s 物件其實都是從 yaml 檔來的喔!
為了確定好 Pod 是不是真的有被建立起來,這時候就可以下 kubectl get pods
查看所有建立好的 Pod。
當然如果想知道這個 Pod 被建立到哪個機器上也可以下 kubectl get pods -o=wide
這樣就會秀出這個 Pod 相關建立資訊。
這邊讀者應該都會覺得資訊好像顯示太少了,其實 kubectl
也是有可以顯示該 Pod 全部資訊的功能,只要下 kubectl describe pod PodName
即可,describe
這個參數就是描述的意思,所以那句指令的意思就是我要描述一個叫 PodName
的 Pod。
還記得筆者一直提到 Pod 只是個單位,重點是裡面執行的 container 嗎?為了確保該 Pod 內的 container 是真的有在運行的,這時候就可以利用 exec
這個參數,這時候只要下 kubectl exec -ti PodName -- /bin/sh
即可。
進到 container 下指令看起來都有完美的運行,連 Hello World 都有順利的顯示出來,果然 Hello World 是學習程式基礎的好夥伴呢XD
今天介紹了 Pod 的相關觀念以及寫法,在本次的系列文中,筆者會慢慢從最下層往上推進,這樣才能方便讀者們更快上手 K8s 的相關操作。
如果對於文章有任何問題都歡迎留言跟我說,下一篇文章會提 Labels,我們就下篇文章見吧~
不知道是不是 windows 的關係,跑下方指令得到這個 QQ
$ kubectl apply -f helloworld.pod.yaml
error: the path "helloworld.pod.yaml" does not exist